"""
magic methods:魔法方法
魔法方法是python内置方法，不需要主动调用，存在的目的是为了给python的解释器进行调用，
几乎每个魔法方法都有一个对应的内置函数，或者运算符，当我们对这个对象使用这些函数或者
运算符时就会调用类中的对应魔法方法，可以理解为重写内置函数。
"""


class Cat:
    """
    这是一只猫的类，通过 obj.__doc__ 打印
    """

    def __init__(self, name, cat_length=10):
        self.name = name
        self.__privatename = name  # 加两个下划线，私有变量，类外不可以访问
        self.length = cat_length
        print("cat.__init__(): I am a cat. My name is %s" % self.name)

    # 使类也可以像函数一样被调用
    def __call__(self, *args, **kwargs):
        print("cat.__call__(): ", args[0] + args[1])

    # 定义print(cat)直接打印得到的信息
    # 若不定义默认为<DemoClass.Cat object at 0x000001E8A0F32388> 形式
    def __str__(self):
        return "I am %s" % self.name

    # 定义长度信息，print(len(cat))可以得到
    def __len__(self):
        return self.length

    # 迭代器
    def __iter__(self):
        return iter([1, 2, 3, 4])

    def __getitem__(self, item):
        if item == 'name':
            return self.name
        else:
            return None

    def __setitem__(self, key, value):
        if key == 'name':
            self.name = value

    def __delitem__(self, key):
        if key == 'name':
            del self.name

    def __add__(self, other):
        """
        在实际应用中，需要判断 other 的类型，不能直接简单相加
        """
        if isinstance(other, Cat):
            return [self, other]
        elif isinstance(other, list):
            return other.append(self)

    def __del__(self):
        print("cat.__del__: I am deleted.")
